from supergirl import models
from gideon.service.starlabs import site
from supergirl.views.student import StudentHandler
from supergirl.views.coursehandler import CourseHandler
from supergirl.views.schoolhandler import SchoolHandler
from supergirl.views.score_record import ScoreRecordHandler
from supergirl.views.userinfohandler import UserInfoHandler
from supergirl.views.course_record import CourseRecordHandler
from supergirl.views.classlisthandler import ClassListHandler
from supergirl.views.consult_record import ConsultRecordHandler
from supergirl.views.departmenthandler import DepartmentHandler

from supergirl.forms.classforms import ClassListModelForm
from supergirl.forms.studentforms import StudentModelForm
from supergirl.forms.scorerecordforms import ScoreRecordModelForm
from supergirl.forms.courserecordforms import CourseRecordModelForm
from supergirl.views.publicustomerhandler import PublicCustomerHandler
from supergirl.views.privatecustomerhandler import PrivateCustomerHandler
from supergirl.forms.customforms import PublicCustomModelForm, PrivateCustomModelForm
from supergirl.views.payment_record import PaymentRecordHandler, CheckPaymentRecordHandler

# 1. 校区管理，简单CRUD
site.register(models.School, SchoolHandler)
# 2. 部门管理，简单CRUD
site.register(models.Department, DepartmentHandler)
# 3. 用户管理
# 含有搜索关键字功能/组合搜索功能
# 添加修改使用不同form 修改时定义外键id为key
# 新增重置密码操作按钮
# 重置密码url与逻辑
# 新建记录时保存m2m字段（与role对应关系）数据
site.register(models.UserInfo, UserInfoHandler)
# 4. 课程管理，简单CRUD
site.register(models.Course, CourseHandler)
# 5. 班级管理
# 新建记录时保存m2m字段数据
# 新定义course字段（班级，自定义字符串拼接）显示方法
# 定义授课老师m2m类型显示方法
# 定义开班时间日期的显示方法
# 表格显示上课记录的链接按钮，定义上课记录的链接，链接到上课记录显示界面
# form中使用自定义日期html插件
# models定义custom_model_name修改url显示
# models限定班主任以及任课老师的部门
# 添加编辑页面增加日期插件
site.register(models.ClassList, ClassListHandler, model_form_class=ClassListModelForm)
# 6. 公户/私户管理
# 操作同一张表，通过url前缀的不同进行区分，每一个都自动生成CRUD逻辑
# 公户逻辑：
# 批量添加公户用户到私户中
# 自定义queryset
# 新增查看跟进记录功能按钮以及查看逻辑，跟进记录使用时间树显示
# gideon 控制是否显示添加按钮 (权限控制到按钮粒度，在程序中使用代码控制，控制条件更精细。使用oracle在template控制，控制更方便、快捷)
# 私户逻辑：
# 批量移除私户用户到公户
# 自定义保存时自动设置顾问为自己
# 表格显示跟进记录和缴费信息的链接按钮
site.register(models.Customer, PublicCustomerHandler, "pub", PublicCustomModelForm)
site.register(models.Customer, PrivateCustomerHandler, "priv", PrivateCustomModelForm)
# 7. 跟进记录，主要通过私户链接过来
# 与payment共用基类，重写url，需要通过custom id进行再进一步限制查询范围，根据传入用户id重新完成get queryset内容
# url反向生成方法重写，符合重写的url规则
# 重新定义save方法
site.register(models.ConsultRecord, ConsultRecordHandler)
# 8. 缴费管理
# url不允许编辑和删除
# 添加时需要完善学生信息和修改不需要，定义两种操作form实例不同
# 申请日期和缴费审批日期使用日期格式显示
site.register(models.PaymentRecord, PaymentRecordHandler)
# 9. 缴费审批
# 批量操作从属性层面重写
# 删除操作和管理按钮的出现
# 自定义order_list属性
# 只能用来审批使用，增删改均不可以
# 申请日期和缴费审批日期使用日期格式显示
site.register(models.PaymentRecord, CheckPaymentRecordHandler, "check")
# 10. 学生管理
# 不显示新增、删除按钮，修改只能修改一些基础信息
# 定义模糊搜索以及分组选择，分组选择时Operation定义了text_func
# 自定义积分的链接显示以及m2m字段显示
site.register(models.Student, StudentHandler, model_form_class=StudentModelForm)
# 11. 学生积分管理
# 不能删除、修改字段，重写add、list方向生成方法
# 重定义获取queryset数据以及获取url数据
# 保存时手动赋值客户id 当前操作人id，保存结束后，更新保存积分的当前总量
site.register(models.ScoreRecord, ScoreRecordHandler, model_form_class=ScoreRecordModelForm)
# 12. 上课记录
# 重写批量操作显示，编写批量初始化考勤逻辑
# 重写get queryset方法
# 重写urls方法以及方向生成方法
# 保存时需要手动指定FK的key值
# 新增考勤url、考勤查看与保存逻辑以及考勤在课程记录显示的按钮
site.register(models.CourseRecord, CourseRecordHandler, model_form_class=CourseRecordModelForm)
